#ifndef UDT_C_WRAPPER_H
#define UDT_C_WRAPPER_H

enum UDTOpt
{
   UDT_MSS,             // the Maximum Transfer Unit
   UDT_SNDSYN,          // if sending is blocking
   UDT_RCVSYN,          // if receiving is blocking
   UDT_CC,              // custom congestion control algorithm
   UDT_FC,              // deprecated, for compatibility only
   UDT_SNDBUF,          // maximum buffer in sending queue
   UDT_RCVBUF,          // UDT receiving buffer size
   UDT_LINGER,          // waiting for unsent data when closing
   UDP_SNDBUF,          // UDP sending buffer size
   UDP_RCVBUF,          // UDP receiving buffer size
   UDT_MAXMSG,          // maximum datagram message size
   UDT_MSGTTL,          // time-to-live of a datagram message
   UDT_RENDEZVOUS,      // rendezvous connection mode
   UDT_SNDTIMEO,        // send() timeout
   UDT_RCVTIMEO,	        // recv() timeout
   UDT_CUSTOM_CC_ENABLED,  //enable use of custom congestion control algorithms     
   UDT_CCN                 //congestion control algorithm to be used        
};

const static int INVALID_UDTSOCK = -1;
typedef int UDTSOCKET;
typedef void (*UDT_MEM_ROUTINE)(char*, int, void*);

UDTSOCKET udt_socket(int af, int type, int protocol);
int udt_bind(UDTSOCKET u, const struct sockaddr* name, int namelen);
int udt_listen(UDTSOCKET u, int backlog);
UDTSOCKET udt_accept(UDTSOCKET u, struct sockaddr* addr, int* addrlen);
int udt_connect(UDTSOCKET u, const struct sockaddr* name, int namelen);
int udt_close(UDTSOCKET u);
int udt_getpeername(UDTSOCKET u, struct sockaddr* name, int* namelen);
int udt_getsockname(UDTSOCKET u, struct sockaddr* name, int* namelen);
int udt_getsockopt(UDTSOCKET u, int level, enum UDTOpt optname, void* optval, int* optlen);
int udt_setsockopt(UDTSOCKET u, int level, enum UDTOpt optname, const void* optval, int optlen);
int udt_shutdown(UDTSOCKET u, int how);
int udt_send(UDTSOCKET u, const char* buf, int len, int flags, int* handle, UDT_MEM_ROUTINE routine, void* context);
int udt_recv(UDTSOCKET u, char* buf, int len, int flags, int* handle, UDT_MEM_ROUTINE routine, void* context);
int udt_sendmsg(UDTSOCKET u, const char* buf, int len, int ttl, int inorder);
int udt_recvmsg(UDTSOCKET u, char* buf, int len);
int udt_getoverlappedresult(UDTSOCKET u, int handle, int* progress, int wait);
int udt_getlasterror();

#endif
